package com.cskaoyan.javase.oop2._1extends._9override._1basic;

/**
 * 方法的覆盖/重写(override)的语法
 * 注解"@Override"
 * 它写在子类重写父类方法的方法头上面,用来语法校验该方法是否重写自父类
 * 如果是,语法不会报错,反之,会编译报错
 * 以后大家的开发中,每天都会接触方法的重写
 * 禁止重写方法,不写该注解,使用"@Override"表示重写方法好处是很明显的:
 *      1.可以检查重写语法,避免出现错误认为是重写方法,导致一些错误.
 *      2.可以提升代码可读性,看到该注解,很容易知道该方法重写自父类
 *
 * 父子类中出现同名成员方法,是有固定语法限制的,不是乱写的
 * 对于以下父类中成员方法:
 * [访问权限修饰符] 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 方法的覆盖,对子类中重写父类方法是有限制的:
 *      1.访问权限修饰符是可以修改的,可以变得更宽松,但是不能更严格,当然也可以保持一致
 *
 *      2.返回值类型并不要求完全一致,实际上子类是可以改写返回值类型的.具体要求,请大家自行测试.
 *      角度:
 *      a.void和基本数据类型 返回值类型
 *      b.引用数据类型
 *
 *      3.方法名必须严格保持一致.
 *      4.形参列表也必须保持一致.
 *      5.方法体可以任意修改,也可以保持一致,总之没有要求.
 *
 *  十年前的面试题
 *  方法的重写override vs 方法的重载overload
 *  区别很大
 *
 * @since 10:16
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Father fs = new Son();
        fs.test();
    }
}

class Father {
    void test() {
        System.out.println("father");
    }
}

class Son extends Father {
    @Override
    protected void test() {
        System.out.println("son");
    }

    // @Override
    public void test2() {

    }
}